package com.ruoyi.system.service.impl;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.SysClassHeadMapper;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.util.CollectionUtils;
import org.springframework.util.unit.DataUnit;

/**
 * 排课头Service业务层处理
 *
 * @author ruoyi
 * @date 2025-06-27
 */
@Service
public class SysClassHeadServiceImpl implements ISysClassHeadService
{
    @Autowired
    private SysClassHeadMapper sysClassHeadMapper;

    /** 课程表 */
    @Autowired
    private ISysClassService sysClassService;

    /** 合同明细service接口层 */
    @Autowired
    private ISysContractLabelService sysContractLabelService;

    /** 合同service接口层 */
    @Autowired
    private ISysContractService sysContractService;

    /** 排课明细service接口层 */
    @Autowired
    private ISysClassLabelService sysClassLabelService;

    /**
     * 查询排课头
     *
     * @param id 排课头主键
     * @return 排课头
     */
    @Override
    public SysClassHead selectSysClassHeadById(Long id)
    {
        return sysClassHeadMapper.selectSysClassHeadById(id);
    }

    /**
     * 查询排课头列表
     *
     * @param sysClassHead 排课头
     * @return 排课头
     */
    @Override
    public List<SysClassHead> selectSysClassHeadList(SysClassHead sysClassHead)
    {
        return sysClassHeadMapper.selectSysClassHeadList(sysClassHead);
    }

    /**
     * 新增排课头
     *
     * @param sysClassHead 排课头
     * @return 结果
     */
    @Override
    @Transactional
    public int insertSysClassHead(SysClassHead sysClassHead)
    {
        int status = 0;
        try {
            //上课时间
            String classTimeSlot = sysClassHead.getClassTimeSlot();
            //上课日期
            String classDate = sysClassHead.getClassDate();
            //教师主键
            Long teacherId = sysClassHead.getTeacherId();
            //判断方法
            emptyInsetSysClassHead(sysClassHead);
            //查询合同明细
            SysContractLabel sysContractLabel = sysContractLabelService.selectSysContractLabelById(sysClassHead.getContractLabelId());
            //判断为新增还是修改
            //新增
            if (null == sysClassHead.getId()){
                status = sysClassHeadMapper.insertSysClassHead(sysClassHead);

                //判断明细是否够新增
                if (sysContractLabel.getRemainingClassTime() - sysClassHead.getWeek() < 0){
                    throw new RuntimeException("当前合同剩余课时不足");
                }

                for (int i = 0;i < sysClassHead.getWeek();i++){
                    //根据合同明细查询合同
                    SysClass sysClass = new SysClass();
                    sysClass.setContractLabelId(sysClassHead.getContractLabelId());
                    //构建表体
                    sysClass = sysClassService.buildClassByContractId(sysClass);

                    //最大人数
                    sysClassHead.setMaxNum(sysClass.getMaxNum());

                    //上课时间
                    sysClass.setClassDate(DateUtils.parseDate(this.postPoneWeeks(sysClassHead.getClassDate(),i)));
                    //表头
                    sysClass.setClassHeadId(sysClassHead.getId());

                    //教师
                    sysClass.setTeacherId(sysClassHead.getTeacherId());

                    //时间段
                    sysClass.setClassTimeSlot(sysClassHead.getClassTimeSlot());

                    //新增
                    sysClassService.insertSysClass(sysClass);
                }
                //修改方法
                this.updateSysClassHead(sysClassHead);
            }
            //新增明细
            else {
                sysClassHead = this.selectSysClassHeadById(sysClassHead.getId());
                sysClassHead.setClassTimeSlot(classTimeSlot);
                sysClassHead.setClassDate(classDate);
                sysClassHead.setTeacherId(teacherId);
                List<SysClass> sysClassList = sysClassService.selectSysClassByClassHeadIdAndClssDateBigNow(sysClassHead.getId(),sysClassHead.getClassTimeSlot());
                if (sysContractLabel.getRemainingClassTime() - sysClassList.size() < 0){
                    throw new RuntimeException("当前合同明细剩余课程不足");
                }
                //判断课程是否达到饱和
                //判断上课时间是否相同
                if (!CollectionUtils.isEmpty(sysClassList)){
                    if (sysClassList.get(0).getClassTimeSlot().equals(classTimeSlot)){
                        if ((sysClassList.get(0).getSysClassLabelList().size() + 1) > sysClassHead.getMaxNum()){
                            throw new RuntimeException("当前课程已达到饱和");
                        }
                        //新增明细
                        for (int i = 0;i < sysClassList.size();i++){
                            SysClassLabel sysClassLabel = new SysClassLabel();
                            sysClassLabel.setClassId(sysClassList.get(i).getId());
                            sysClassLabel.setContractLabelId(sysContractLabel.getId());
                            status = sysClassLabelService.insertSysClassLabel(sysClassLabel);
                        }
                    }
                }
                else {
                    for (int i = 0;i < sysClassHead.getWeek();i++){
                        //根据合同明细查询合同
                        SysClass sysClass = new SysClass();
                        sysClass.setContractLabelId(sysContractLabel.getId());
                        //构建表体
                        sysClass = sysClassService.buildClassByContractId(sysClass);

                        //最大人数
                        sysClassHead.setMaxNum(sysClass.getMaxNum());

                        //上课时间
                        sysClass.setClassDate(DateUtils.parseDate(this.postPoneWeeks(sysClassHead.getClassDate(),i)));
                        //表头
                        sysClass.setClassHeadId(sysClassHead.getId());

                        //教师
                        sysClass.setTeacherId(sysClassHead.getTeacherId());

                        //时间段
                        sysClass.setClassTimeSlot(sysClassHead.getClassTimeSlot());

                        //新增
                        sysClassService.insertSysClass(sysClass);
                    }
                    //修改合同明细方法
                    sysContractLabelService.updateSysContractLabel(sysContractLabel);
                }

                //修改合同明细方法
                sysContractLabelService.updateSysContractLabel(sysContractLabel);
            }
        }
        catch (Exception e){
            //事务回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            throw new RuntimeException(e.getMessage());
        }
        return status;
    }

    /**
     * 排课表
     * @param sysClassHead
     */
    @Override
    public void emptyInsetSysClassHead(SysClassHead sysClassHead) {
        /*if (null == sysClassHead.getSysClass()){
            throw new RuntimeException("排课信息未传，请联系管理员");
        }*/
        //时间段
        if (StringUtils.isEmpty(sysClassHead.getClassTimeSlot())){
            throw new RuntimeException("时间段未传，请联系管理员");
        }
        //教师
        if (null == sysClassHead.getTeacherId()){
            throw new RuntimeException("教师未传,请联系管理员");
        }
        //sysClassService.emptyInsertSysClass(sysClassHead.getSysClass());
    }

    /**
     * 将日期延后指定周数
     * @param date
     * @param weeks
     * @return
     */
    @Override
    public String postPoneWeeks(String date, int weeks) {
        Date nowDate = DateUtils.parseDate(date);
        //创建Calendar实例并设置时间
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(nowDate);

        //增加指定周数
        calendar.add(Calendar.WEEK_OF_YEAR,weeks);

        //创建输出格式器
        SimpleDateFormat sdfOutput = new SimpleDateFormat("yyyy-MM-dd");
        return sdfOutput.format(calendar.getTime());
    }

    /**
     * 修改排课头
     *
     * @param sysClassHead 排课头
     * @return 结果
     */
    @Override
    public int updateSysClassHead(SysClassHead sysClassHead)
    {
        return sysClassHeadMapper.updateSysClassHead(sysClassHead);
    }

    /**
     * 批量删除排课头
     *
     * @param ids 需要删除的排课头主键
     * @return 结果
     */
    @Override
    public int deleteSysClassHeadByIds(Long[] ids)
    {
        return sysClassHeadMapper.deleteSysClassHeadByIds(ids);
    }

    /**
     * 删除排课头信息
     *
     * @param id 排课头主键
     * @return 结果
     */
    @Override
    public int deleteSysClassHeadById(Long id)
    {
        return sysClassHeadMapper.deleteSysClassHeadById(id);
    }
}